//import WebSocket from 'ws';
import { v4 as uuidv4 } from 'uuid';
// 生成32位随机ID
const sessionId = uuidv4().replace(/-/g, '').slice(0, 32);

// 若没有将API Key配置到环境变量，可将下行替换为：apiKey = 'your_api_key'。不建议在生产环境中直接将API Key硬编码到代码中，以减少API Key泄露风险。
const url = 'ws://localhost:8001/ws/' + sessionId; // WebSocket服务器地址
//const audioFile = 'asr_example.wav'; // 替换为您的音频文件路径


// 创建WebSocket客户端
const ws = new WebSocket(url);

export const openWs=()=>{
    // 连接打开时发送run-task指令
    ws.onopen=() => {
        console.log('连接到服务器');
        //sendRunTask();
    };
    sendAudioStream();
}
// 接收消息处理
ws.onmessage=(event)=>{
    console.log("接收到的消息：",event);
    const message = JSON.parse(event.data);
    switch (message.header.event) {
        case 'task-started':
            console.log('任务开始');
            sendAudioStream();
            break;
        case 'result-generated':
            console.log('识别结果：', message.payload.output.sentence.text);
            break;
        case 'task-finished':
            console.log('任务完成');
            ws.close();
            break;
        case 'task-failed':
            console.error('任务失败：', message.header.error_message);
            ws.close();
            break;
        default:
            console.log('未知事件：', message.header.event);
    }
}

// 发送run-task指令
function sendRunTask() {
    const runTaskMessage = {
        header: {
            action: 'run-task',
            task_id: sessionId,
            streaming: 'duplex'
        },
        payload: {
            task_group: 'audio',
            task: 'asr',
            function: 'recognition',
            model: 'paraformer-realtime-v2',
            parameters: {
                sample_rate: 16000,
                format: 'wav'
            },
            input: {}
        }
    };
    ws.send(JSON.stringify(runTaskMessage));
}

// 发送音频流
let sendIntervalId: string | number | NodeJS.Timeout | undefined;
function sendAudioStream() {
    console.log("开始监听麦克风接收音频")
    // 初始化音频
    navigator.mediaDevices.getUserMedia({ audio: true })
        .then(stream => {
            console.log("获取音频数据")
            const audioContext = new window.AudioContext();
            const source = audioContext.createMediaStreamSource(stream);

            // 使用 AudioWorklet（推荐）
            audioContext.audioWorklet.addModule('audio-worker.js').then(() => {
                const workletNode = new AudioWorkletNode(audioContext, 'audio-worker');
                source.connect(workletNode);
                console.log("即将开始获取音频")
                // 存储最新的音频数据
                let currentAudioData: { buffer: any; } | null = null;
                // 接收音频数据并存储到 currentAudioData
                workletNode.port.onmessage = (event) => {
                    currentAudioData = event.data; // 存储最新的 Float32Array
                };
                // 控制发送频率（例如每20ms发送一次）
                const sendInterval = 500; // 毫秒

                // 定时器函数：每隔 sendInterval 毫秒发送一次数据
                function startSending() {
                    sendIntervalId = setInterval(() => {
                        if (currentAudioData) {
                            console.log("获取到音频，准备发送,", currentAudioData);
                            const arrayBuffer = currentAudioData.buffer;
                            ws.send(arrayBuffer); // 发送二进制数据
                            currentAudioData = null; // 清空，等待下次数据
                        }
                    }, sendInterval);
                }
                // 开始发送定时器
                startSending();

                // 可选：在 WebSocket 关闭时停止定时器
                ws.onclose = () => {
                    clearInterval(sendIntervalId);
                };
            });

        })
        .catch(error => console.error('麦克风访问失败:', error));
}

ws.onerror = (event) => {
    console.error('WebSocket Error:', event);
}

export const sendFinishTask=()=>{
    console.log("关闭发送音频");
    ws.send("语音输入结束")
    clearInterval(sendIntervalId);
}